package meb

import (
    "fmt"
    "github.com/gin-gonic/gin"
    "github.com/stripe/stripe-go/v72"
    "github.com/stripe/stripe-go/v72/product"
    "log/slog"
    "os"
    "gorm.io/gorm"
    "vitepress-serve/internal/common/hgin"
    "vitepress-serve/internal/model"
    "github.com/stripe/stripe-go/v72/price"  // 添加 price 包
)

// SyncStripeProductsArgs 同步产品参数
type SyncStripeProductsArgs struct {
    ProductId string `json:"productId" binding:"required"`
}

// SyncStripeProducts 同步指定的 Stripe 产品到数据库
func (ctl *Controller) SyncStripeProducts(ctx *gin.Context) (err error) {
    var args = hgin.ApiReq[SyncStripeProductsArgs](ctx)
    stripe.Key = os.Getenv("STRIPE_SECRET_KEY")

    slog.Info("开始同步 Stripe 产品", "productId", args.ProductId)
    
    // 获取指定产品
    p, err := product.Get(args.ProductId, nil)
    if err != nil {
        slog.Error("获取 Stripe 产品失败", "error", err, "productId", args.ProductId)
        return fmt.Errorf("获取 Stripe 产品失败: %w", err)
    }

    // 获取产品价格
    params := &stripe.PriceListParams{
        Product: stripe.String(p.ID),
        Active:  stripe.Bool(true),
    }
    prices := price.List(params)
    if err := prices.Err(); err != nil {
        slog.Error("获取产品价格失败", "error", err, "productId", p.ID)
        return fmt.Errorf("获取产品价格失败: %w", err)
    }

    // 获取第一个有效价格
    var unitPrice uint64
    for prices.Next() {
        pr := prices.Price()
        unitPrice = uint64(pr.UnitAmount)
        break
    }

    // 转换为数据库模型
    dbProduct := model.Product{
        ProdId:    p.ID,
        ProdName:  p.Name,
        UnitPrice: unitPrice,
        MarkPrice: unitPrice,  // 可以根据需要设置不同的市场价
        Intro:     p.Description,
        Status:    model.ProductStatus_UP,
        Rank:     100,
    }

    // 处理可选字段
    if len(p.Images) > 0 {
        dbProduct.Thumb = p.Images[0]
    }
    if prodType, ok := p.Metadata["type"]; ok {
        dbProduct.Type = model.ProductType(prodType)
    }

    // 使用 upsert 更新或插入产品
    // 先查询产品是否存在
    var existingProduct model.Product
    result := ctl.db.Where("prod_id = ?", p.ID).First(&existingProduct)
    
    if result.Error == nil {
        // 产品存在，执行更新
        if err = ctl.db.Model(&existingProduct).Updates(dbProduct).Error; err != nil {
            slog.Error("更新产品失败", 
                "productId", p.ID,
                "error", err,
            )
            return fmt.Errorf("更新产品失败: %w", err)
        }
        slog.Info("更新产品成功", 
            "productId", p.ID,
            "name", p.Name,
        )
    } else if result.Error == gorm.ErrRecordNotFound {
        // 产品不存在，执行插入
        if err = ctl.db.Create(&dbProduct).Error; err != nil {
            slog.Error("创建产品失败", 
                "productId", p.ID,
                "error", err,
            )
            return fmt.Errorf("创建产品失败: %w", err)
        }
        slog.Info("创建产品成功", 
            "productId", p.ID,
            "name", p.Name,
        )
    } else {
        // 其他错误
        return fmt.Errorf("查询产品失败: %w", result.Error)
    }

    hgin.ApiRes(ctx, gin.H{
        "status": "1",
        "message": "同步完成",
        "data": dbProduct,
    })
    return nil
}